package com.demo.utils;

import org.junit.Test;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @author gy
 * @date 2024/4/24
 */
public class RandomUtils {

    /**
     * 从集合中随机取出N个不重复的元素
     */
    @Test
    public void m1(){
        long startTime = System.currentTimeMillis();

        ArrayList<Integer> idList = new ArrayList<>();
        for (int i = 1; i <= 20; i++) {
            idList.add(i);
        }

        List<Integer> randoms = createRandoms(idList, 3);
        for (Integer random : randoms) {
            System.out.println(random);
        }
        String str = randoms.stream().map(String::valueOf)
                .collect(Collectors.joining(","));
        System.out.println(str);

        long endTime = System.currentTimeMillis();
        System.out.println("执行耗时["+(endTime - startTime)+"]毫秒");
    }

    /**
     * 从集合中随机取出N个不重复的元素  集合泛型不具体 方便通用
     * @param list 需要被取出数据的集合
     * @param n 取出的元素数量
     * @return
     */
    private <T> List<T> createRandoms(List<T> list, int n) {
        Map<Integer,String> map = new HashMap<>(16);
        List<T> news = new ArrayList<>();
        if (list.size() <= n) {
            return list;
        }
        while (map.size() < n) {
            int random = (int)(Math.random() * list.size());
            if (!map.containsKey(random)) {
                map.put(random, "");
                news.add(list.get(random));
            }
        }
        return news;
    }


    /**
     * random.nextInt(max)表示生成[0,max]之间的随机数，然后对(max-min+1)取模。
     *
     * 以生成[10,20]随机数为例，首先生成0-20的随机数，然后对(20-10+1)取模得到[0-10]之间的随机数，
     * 然后加上min=10，最后生成的        是10-20的随机数
     */
    @Test
    public void m2(){
        long startTime = System.currentTimeMillis();
        Random random = new Random();

        int max = 80;
        int min = 30;

        int s = random.nextInt(max)%(max-min+1) + min;

        System.out.println(s);

        long endTime = System.currentTimeMillis();
        System.out.println("执行耗时["+(endTime - startTime)+"]毫秒");
    }
}
